library(tidyverse)
library(datasauRus)
library(GGally)
library(reshape)
Em análise exploratória, com frequência queremos examinar se há associação entre duas variáveis numéricas. Para descrever uma associação como essa, há pelo menos quatro características importantes:
Para relacionar variáveis, podemos usar técnicas de visualização como gráficos de dispersão (scatter plots). Outra técnica é a análise de correlação.
Correlação é uma medida que indica se a relação entre 2 variáveis é estatisticamente significativa.
O coeficiente de correlação de Pearson é o mais popular e usado principalmente para relações lineares. Outros coeficientes de correlação robustos e úteis para outros tipos de relação são os coeficientes de Spearman e Kendall.
O coeficiente de correlação de Pearson indica a força e a direção da correlação linear entre duas variáveis. Seu coeficiente amostral para as variáveis x e y é definido por:
\[r_{xy} = \frac{1}{n-1} \sum_{i=1}^{n} \left( \frac{x_i - \bar{x}}{s_x} \right) \left( \frac{y_i - \bar{y}}{s_y} \right) \]
O valor do coeficiente \(r_{xy}\) varia de -1 a 1:
Tipicamente, se adota esses valores para indicar a força da correlação:
Conselho importante: não há um número apenas que possa lhe responder tudo sobre a associação entre as duas variáveis. As medidas de correlação que você usará servirão mais para complementar e quantificar observações feitas em gráficos de dispersão do que para lhe guiar.
Um exemplo classico com quatro pares de variáveis cujas associações interessam: x1 e y1, x2 e y2, etc., o quarteto de Anscombe:
summary(anscombe)
x1 x2 x3 x4 y1 y2
Min. : 4.0 Min. : 4.0 Min. : 4.0 Min. : 8 Min. : 4.260 Min. :3.100
1st Qu.: 6.5 1st Qu.: 6.5 1st Qu.: 6.5 1st Qu.: 8 1st Qu.: 6.315 1st Qu.:6.695
Median : 9.0 Median : 9.0 Median : 9.0 Median : 8 Median : 7.580 Median :8.140
Mean : 9.0 Mean : 9.0 Mean : 9.0 Mean : 9 Mean : 7.501 Mean :7.501
3rd Qu.:11.5 3rd Qu.:11.5 3rd Qu.:11.5 3rd Qu.: 8 3rd Qu.: 8.570 3rd Qu.:8.950
Max. :14.0 Max. :14.0 Max. :14.0 Max. :19 Max. :10.840 Max. :9.260
y3 y4
Min. : 5.39 Min. : 5.250
1st Qu.: 6.25 1st Qu.: 6.170
Median : 7.11 Median : 7.040
Mean : 7.50 Mean : 7.501
3rd Qu.: 7.98 3rd Qu.: 8.190
Max. :12.74 Max. :12.500
# um pouco de rearrumação primeiro.
# (para entender melhor, você pode procurar sobre tidy data em R)
t1 <- melt(select(anscombe, 1:4), id = c())
t2 <- melt(select(anscombe, 5:8), id = c())
dados <- data.frame(vars = paste(t1$variable, "e", t2$variable),
v1 = t1$value,
v2 = t2$value)
Calculando a correlação linear:
dados %>%
group_by(vars) %>%
summarise(correlacao_pearson = cor(v1, v2, method = "pearson"))
E se olharmos os dados?
ggplot(dados, aes(v1, v2)) +
geom_point(color = "darkorange", size = 4, alpha = 0.7) +
theme_bw() +
scale_x_continuous(breaks = seq(0, 20, 2)) +
scale_y_continuous(breaks = seq(0, 12, 2)) +
expand_limits(x = 0, y = 0) +
facet_wrap(~ vars)
Quatro relações diferentes, mesma quantificação. Para o segundo grupo, não há uma relação linear. No 3o, há uma relação perfeita entre a maioria das observações, com uma exceção. No 4o grupo não há relação; há uma exceção que faz parecer que há uma relação.
O que os outros coeficientes podem nos dizer?
dados %>%
group_by(vars) %>%
summarise(pearson = cor(v1, v2, method = "pearson"),
spearman = cor(v1, v2, method = "spearman"),
kendall = cor(v1, v2, method = "kendall"))
Dito isso, essa figura ajuda a lembrar a relação entre o valor esperado do coeficiente (linear) e vários tipos de associação entre duas variáveis:
da wikipedia
Relação linear:
set.seed(123)
x <- rnorm(100) * 100
tamanho_do_erro <- 50
y <- 0.5 * x + rnorm(100) * tamanho_do_erro + 20
df <- data.frame(x = x,
y = y)
ggplot(df, aes(x = x, y = y)) +
geom_point(colour = "darkorange", size = 4) +
theme_bw()
cor(df$x, df$y, method = "pearson")
[1] 0.66713
# Dobro de erro em torno de uma função linear f(x)
df$y <- 0.5 * x + rnorm(100) * tamanho_do_erro * 2 + 20
ggplot(df, aes(x = x, y = y)) +
geom_point(colour = "darkorange", size = 4) +
theme_bw()
cor(df$x, df$y, method = "pearson")
[1] 0.3339445
Relação não linear
n = 100
df <- data.frame(x = runif(n, min= 1, max = 20))
df$y = 100 * exp(-1.2 * df$x) #+ rnorm(n, mean = 0.05, sd = 1)
ggplot(df, aes(x = x, y = y)) +
geom_point(colour = "darkorange", size = 4) +
theme_bw()
cor(df$x, df$y)
[1] -0.5252222
cor(df$x, df$y, method = "spearman")
[1] -1
cor(df$x, df$y, method = "kendall")
[1] -1
# Em escala de log
ggplot(df, aes(x = x, y = y)) +
geom_point(colour = "darkorange", size = 4) +
scale_y_log10() +
theme_bw()
ATENÇÃO! Correlação não implica causalidade. Alguns materiais sobre o tema:
datasaurus_dozen %>%
group_by(dataset) %>%
summarise_all(funs(mean, sd))
datasaurus_dozen %>%
group_by(dataset) %>%
summarise(correlacao = cor(x, y))
datasaurus_dozen %>%
group_by(dataset) %>%
ggplot(aes(x = dataset, y = y)) +
geom_boxplot()
datasaurus_dozen %>%
group_by(dataset) %>%
ggplot(aes(x = dataset, y = y)) +
geom_violin()
ggplot(datasaurus_dozen, aes(x=x, y=y, colour=dataset))+
geom_point()+
theme(legend.position = "none")+
facet_wrap(~dataset, ncol=4)